﻿#include <string>
#include <vector>
#include <fstream>
#include <iostream>
#include "Buffer.h"
#include "Wpmz.h"
#include "wpml.h"

// 创建并填充示例数据
wpml::Document createSampleDocument()
{
	wpml::Document doc;

	// 添加航点数据
	doc.wayline.waypoints = {
		wpml::WaypointT(113.958298915883, 22.5428601764565),
		wpml::WaypointT(113.957794329494, 22.5424452667718),
		wpml::WaypointT(113.958521145289, 22.5422044098946),
		wpml::WaypointT(113.958625522112, 22.5425843949767)};

	return doc;
}

// 修改 main 函数
int main()
{
	// 创建示例数据对象
	wpml::Document sampleDoc = createSampleDocument();

	std::string a = toTemplate(sampleDoc);
	std::string b = toWaylines(sampleDoc);

	// 将 a 写入 template.kml 文件
	std::ofstream templateFile("template.kml");
	if (templateFile.is_open())
	{
		templateFile << a;
		templateFile.close();
		std::cout << "template.kml 文件已成功写入" << std::endl;
	}
	else
	{
		std::cerr << "无法打开 template.kml 文件" << std::endl;
	}

	// 将 b 写入 waylines.xml 文件
	std::ofstream waylinesFile("waylines.xml");
	if (waylinesFile.is_open())
	{
		waylinesFile << b;
		waylinesFile.close();
		std::cout << "waylines.xml 文件已成功写入" << std::endl;
	}
	else
	{
		std::cerr << "无法打开 waylines.xml 文件" << std::endl;
	}

	// 使用 CBuffer 保存 sampleDoc
	CBuffer buffer(8192);
	buffer << sampleDoc;

	std::cout << "sampleDoc 已序列化到缓冲区，大小: " << buffer.Size() << " 字节" << std::endl;

	// 可选：将缓冲区内容写入文件
	buffer.WriteFile("sampleDoc.bin");
	std::cout << "sampleDoc 已保存到 sampleDoc.bin 文件" << std::endl;

	// 测试反序列化
	CBuffer readBuffer(8);
	readBuffer.ReadFile("sampleDoc.bin");
	readBuffer.Reset();
	wpml::Document restoredDoc;
	readBuffer >> restoredDoc;

	std::cout << "sampleDoc 已从文件反序列化成功" << std::endl;
	// 同时在控制台输出内容（可选）
	std::cout << "\n=== 原始template.kml 内容 ===\n"
			  << a << std::endl;
	std::cout << "\n=== 原始waylines.xml 内容 ===\n"
			  << b << std::endl;
	{
		std::string a = toTemplate(restoredDoc);
		std::string b = toWaylines(restoredDoc);
		// 同时在控制台输出内容（可选）
		std::cout << "\n=== 反序列化template.kml 内容 ===\n"
				  << a << std::endl;
		std::cout << "\n=== 反序列化waylines.xml 内容 ===\n"
				  << b << std::endl;
	}

	std::vector<char> packedData = Wpmz::Pack(sampleDoc);
	wpml::Document unpackedDoc = Wpmz::Unpack(packedData);

	// 验证解包后的数据
	std::string a2 = toTemplate(unpackedDoc);
	std::string b2 = toWaylines(unpackedDoc);

	std::cout << "Pack/Unpack 测试: " << (a == a2 && b == b2 ? "成功" : "失败") << std::endl;

	return 0;
}